﻿using Enyim.Caching;
using Enyim.Caching.Memcached;
using OCS.Memcached;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MCCA
{
    [Serializable]
    class MyClass
    {
        public int id { get; set; }
        public string name { get; set; }
        public DateTime time { get; set; }
    }


    class Program
    {
        static void Main(string[] args)
        {
            try
            {

                MemcachedClient mc = null;
                if (args.Count() > 0 && args[0] == "ocs")
                {
                    mc = MemCached.getInstance();
                    Console.WriteLine("OCS启动");
                }
                else
                {
                    mc = new MemcachedClient();
                    Console.WriteLine("Memcached启动");
                }


                Random rd = new Random();

                var timer = Stopwatch.StartNew();


                Console.WriteLine("=====1.可用性，简单读写一次========");

                ////1.可用性
                //mc.Store(StoreMode.Set, "hello", "lance", TimeSpan.Zero);


                MyClass model = new MyClass()
                {
                    id = 999,
                    name = "asdfhasjdkfhjkasdhfkjhsdf",
                    time = DateTime.Now
                };

                mc.Store(StoreMode.Set, "hello", model, TimeSpan.Zero);


                if (TimeSpan.FromSeconds(0) == TimeSpan.Zero)
                    Console.WriteLine(string.Format("=====1.可用性，简单读写一次 结果：{1}  耗时:{0}========", timer.ElapsedMilliseconds, mc.Get<MyClass>("hello").name));

                mc.FlushAll();

                timer = Stopwatch.StartNew();
                Console.WriteLine("=====2.循环性能1，set 约 5万次========");

                ////2.循环性能
                for (int i = 0; i < 100000; i++)
                {
                    int j = rd.Next(10000);

                    if (j % 2 == 0)
                        mc.Store(StoreMode.Set, i.ToString(), string.Format("item {0}", j));
                }

                Console.WriteLine(string.Format("=====2.循环性能1，set 约 5万次 耗时:{0}========", timer.ElapsedMilliseconds));



                Task.Run(() =>
                    {

                        timer = Stopwatch.StartNew();
                        Console.WriteLine("=====3.多key读取，1000个key，读取10000次========");

                        ////3.多key读取

                        List<string> keys = new List<string>();


                        for (int i = 0; i < 1000; i++)
                        {
                            keys.Add(i.ToString());
                        }

                        for (int i = 0; i < 10000; i++)
                        {
                            var result = mc.Get(keys.ToArray());
                        }

                        Console.WriteLine(string.Format("====3.多key读取，1000个key，读取10000次 耗时:{0}========", timer.ElapsedMilliseconds));

                    });

                Console.WriteLine("主线程完啦");



                timer = Stopwatch.StartNew();
                Console.WriteLine("=====4.循环性能2，set 约 10万次 3k 的数据========");

                ////4.循环性能2
                for (int i = 0; i < 100000; i++)
                {
                    mc.Store(StoreMode.Set, "carol" + i.ToString(), string.Format("itemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemiteitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemitemiteem {0}", i));
                }

                Console.WriteLine(string.Format("===== 4.循环性能2，set 约 10万次 3k 的数据 耗时:{0}========", timer.ElapsedMilliseconds));

                mc.FlushAll();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }


            Console.ReadKey();
        }
    }
}
